#导入蓝图对象
from . import passport_blue
#导入flask内置的对象
from flask import jsonify,request,current_app,make_response,session
#d导入自定义代码
from info.utils.response_code import RET
#导入图片验证码
from info.utils.captcha.captcha import captcha
#导入数据库的实例
from info import redis_store,constants,db
#导入正则随机数
import re,random
#导入云通讯
from info.libs.yuntongxun import sms
from info.models import User
from datetime import datetime
@passport_blue.route('/image_code')
def get_image_code():
    '''
    生成图片验证
    1，获取参数uuid 图片验证码的后缀名实现多用户的同时请求在数据库中存储的唯一
    2，判断参数是否存在如果不存在终止函数执行
    3，调用captcha扩展生成图片验证码 text,name,image
    4,在服务器redis的数据库中寻出图片验证码text
    5,返回图片本身 使用resp = make_response(image)返回
    6,,修改响应的数据类型

    :return:
    '''

    #获取参数uuid
    image_code_id = request.args.get('image_code_id')

    #判断参数的存在
    if not image_code_id:
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')

    #调用capatch生成图片验证码
    name,text,image = captcha.generate_captcha()
    #在redis中保存图片验证码的内容
    try:
        redis_store.setex('ImageCode_' + image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='保存图片验证码失败')
    else:
        response = make_response(image)
        #设置响应的数据类型为iage/jpg
        response.headers['Content-Type'] = 'image/jpg'
        return response
#定义视图函数
@passport_blue.route('/sms_code',methods=['POST'])
def send_sms_code():
    '''
    发送短信
    1，获取参数mobile image_code image_code_id request.json.get()
,   2，判断参数的完整性 三个参数必须全部存在
    3，效验参数是否正确 手机号格式 利用正则
,   4，获取本地存储的真实图片验证码
    5，判断是否过期如果过期直接return
,   6，删除图片验证码
    7，判断图片验证码是否正确
,   8，判断手机号是否已经注册
    9， 生成六位数的短信随机验证码
    10，在redis中存储短信随机数
    11，调用云通讯发送短信并保持发送结果
,   12，判断发送是否成功
    :return:
    '''

    #获取参数手机号图片验证码内容 图片验证码的编号
    mobile = request.json.get('mobile')
    image_code = request.json.get('image_code')
    image_code_id = request.json.get('image_code_id')
    #判断参数的完整性
    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    #检查手机号格式使用正则
    if not re.match(r'^1[345678]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号格式不对')
    #获取本地存储的真实图片验证码
    try:
        real_image_code = redis_store.get('ImageCode_'+image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='获取图片验证码异常')
    #判断获取结果是否有参数
    if not real_image_code:
        return jsonify(errno=RET.NODATA,errmsg='图片验证码已过期')
    #验证码只能让用户验证一次 redis只能验证一次 所以要立即删除
    try:
        redis_store.delete('ImageCode_'+image_code_id)
    except Exception as e:
        current_app.logger.error(e)
    #对比两个验证码是否相同
    if image_code.lower() != real_image_code.lower():
        return jsonify(errno=RET.DATAERR,errmsg='图片验证码错误')
    #判断手机号是否注册在数据库查询
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(error=RET.DBERR,errmsg='查询数据库异常')
    #如果存在显示以存在
    else:
        if user:
            return jsonify(error=RET.DATAEXIST,errmsg='手机号已存在')
    #构造短息随机码
    sms_code = '%06d' % random.randint(0,999999)
    print(sms_code)
    #把短信随机数保存到redis数据库中
    try:
        redis_store.setex('SMScode_'+mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='保存短信验证码异常')
    try:
        ccp = sms.CCP()
        print(mobile)
        #y运用云通讯的模板方法发送短信并保存短信结果
        result = ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg='短信发送异常')
    #判断发送结果
    if result == 0:
        return jsonify(errno=RET.OK,errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR,errmsg='发送失败')

@passport_blue.route('/register',methods=['POST'])
def register():
    '''
    用户注册
    1，获取mobile password sms_code
    2,检查参数的完整性
    3，检查手机号格式
    4，获取本地存储的真实短信验证码
    5，判断短信验证码是否存在
    6，先比较短信验证码是否正确
    7，删除redis数据库中的短信验证码
    8，判断手机号是否已注册
    9，实例化模型类对象保存用户输入的信息
    10，把数据交到数据库中如果出错进行回滚
    11，把用户的信息存储到redis的缓存中
    12，返回结果

    :return:
    '''
    mobile = request.json.get('mobile')
    password = request.json.get('password')
    sms_code = request.json.get('sms_code')
    if not all([mobile,password,sms_code]):
        return jsonify(errno=RET.PARAMERR,ermsg='参数缺失')
    #检查手机号的格式
    if not re.match(r'^1[345678]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,remsg='手机号格式不对')
    #获取本地存储的真实短信验证码
    # try:
    #     real_sms_code = redis_store.get('SMSCode_' + mobile)
    # except Exception as e:
    #     current_app.logger.error(e)
    #     return jsonify(errno=RET.DATAERR,ermsg='获取验证码异常')
    # #判断短信验证码是否存在
    # if not real_sms_code:
    #     return jsonify(errno=RET.DBERR,remsg='验证码已过期')
    # #判断验证码是否正确
    # if real_sms_code != sms_code:
    #     return jsonify(errno=RET.DATAERR,ermsg='验证码错误')
    # #删除redis数据库中的短信验证码
    # try:
    #     redis_store.delete('SMSCode_' + mobile)
    # except Exception as e:
    #     current_app.logger.error(e)
    # #判断手机号是否注册、
    # try:
    #     user = User.query.filter(User.mobile == mobile).first()
    # except Exception as e:
    #     current_app.logger.error(e)
    #     return jsonify(errno=RET.DBERR,ermsg='查询数据失败')
    # if user:
    #     return jsonify(errno=RET.DATAEXIST,ermsg='手机号已注册')
    #实例化模型类对象保存用户输入的信息
    user = User()
    user.mobile = mobile
    user.nick_name = mobile

    #password调用了模型类中的密码加密方法generate_password方法实现密码加密存储
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollbacl()
        return jsonify(errno=RET.DBERR,ermsg='保存数据失败')
    #把用户的信息存储到redis数据库中
    session['user_id'] = user.id
    session['mobile'] = mobile
    session['nick_name'] = user.nick_name
    return jsonify(errno=RET.OK,ermsg='注册成功')
print('添加Mysql')
@passport_blue.route('/login',methods=['POST'])
def login():
    '''
    用户登陆
    1，获取moibile password
    2,检查参数的完整性
    3，检查手机号格式
    4，使用mobiel查询数据库确认用户已注册
    user = User.query.filter(mobile=mobile).first()
    5，判断用户是否注册
    6，调用模型类中的方法效验密码是否正确
    7，保存用户的登陆时间
    8，缓存用户信息
    session['nick_name'] = User.nick_name
    9,返回结果
    :return:
    '''
    #获取mobile passwordi信息
    mobile = request.json.get('mobile')
    password = request.json.get('password')
    #检查参数的完整性
    if not all([mobile,password]):
        return jsonify(errno=RET.PARAMERR,errmsg='缺少参数')
    #检查手机号格式
    if not re.match(r'^1[345678]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号格式不对')
    #使用mobile查询数据库已注册
    try:
        user = User.query.filter(mobile==mobile).first()
    except Exception as e:
        db.session.rollack()
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR,errmsg='查询数据库异常')
    #判断用户是否注册
    # if user:
    #     return  jsonify(error=RET.DBERR,errmsg='电话已注册')
    # #调用模型类中的方法效验密码是否正确
    if user is None or not user.check_password(password):
        return jsonify(errno=RET.PWDERR,errmsg='用户名或密码错误')
    #保存用户的登陆时间
    user.last_login = datetime.now()
    #把用户信息存储到数据库中
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='存储信息失败')
    #把信息缓存到redis数据库中
    session['user_id'] = user.id
    session['user_mobile'] = user.mobile
    session['nick_name'] = user.nick_name
    return jsonify(errno=RET.OK,errmsg='登陆成功')




    pass





